home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / play < prev    next >
Text File  |  2006-05-08  |  8KB  |  279 lines

  1. #!/bin/sh
  2. # Shell script to play/record sound files to/from unix style sound devices.
  3. # Should auto detect most supported systems.
  4. #
  5. # Originally developed by Chris Bagwell (cbagwell@sprynet.com)
  6. #
  7. #   TODO:  Put each set of fopts and filenames on an array and then 
  8. #          play each filename back with the given effect. This
  9. #          would allow the files to be of different data types
  10. #          and sample rates.
  11. #
  12. # Change History:
  13. #
  14. #   Major updates have been supplied by Kjetil Torgrim Homme and 
  15. #   Kirk Goff.
  16.  
  17. # Set up path so that it can find Sox if user's path doesn't already
  18. # include it.
  19. prefix=/usr
  20. exec_prefix=${prefix}
  21. bindir=${exec_prefix}/bin
  22.  
  23. HAVE_ALSA=1
  24. HAVE_OSS=1
  25. HAVE_SUNAU=1
  26.  
  27. # Look for sox in install directory first and then in current direction
  28. # if not found.
  29. PATH="$bindir:.:$PATH"
  30.  
  31. program_name=`basename $0`
  32. rec_mode="no"
  33. if [ "$program_name" = "rec" ]; then
  34.     rec_mode="yes"
  35. fi
  36. program_version="3.0"
  37.  
  38. if [ -z "$1" ]; then
  39.     echo "\
  40. $program_name: too few arguments
  41. Try \`$program_name --help' for more information." 1>&2
  42.     exit 1
  43. fi
  44.  
  45. version()
  46. {
  47.     echo "$program_name (sox) $program_version"
  48.     exit 0
  49. }
  50.  
  51. help()
  52. {
  53.     echo "\
  54. Usage: $program_name [GENERAL OPTIONS] [FORMAT OPTIONS] FILE [EFFECT]...
  55. Play/record sound files to/from unix style sound devices.
  56.  
  57. GENERAL OPTIONS:
  58.  
  59. General options should only be specified one.
  60.  
  61.   -d, --device=DEVICE          use DEVICE for input/output
  62.   -V, --verbose                print verbose information
  63.   -h, --help                   display this help and exit
  64.       --version                output version information and exit
  65.  
  66. FORMAT OPTIONS:
  67.  
  68. File options can be specified for each filename.  Multiple filenames can
  69. be specified when playing audio files but they must all be of
  70. the data type and sample rates.
  71.  
  72.   -c, --channels=CHANNELS      specifies the number of sound channels in FILE
  73.   -f, --format=FORMAT          specifies bit format of sample
  74.                                FORMAT is either s, u, U, A, a, or g
  75.   -r, --rate=RATE              sample rate in hertz of FILE
  76.   -s, --size=SIZE              interpret size of sample
  77.                                SIZE is either b, w, l, f, d, or D
  78.   -t, --type=TYPE              specifies file format of FILE
  79.   -v, --volume=VOLUME          change amplitude
  80.   -x, --xinu                   reverse bit order of sample
  81.                                (only works with 16-bit and 32-bit integer data)
  82.       --file=FILENAME          specify filename
  83.  
  84. EFFECTs are one or more of the following:  avg, band, chorus, copy, cut, 
  85. deemph, echo, echos, flanger, highp, lowp, map, mask, phaser, pick,
  86. polyphase, rate, repeat, resample, reverb, reverse, split, stat, vibro.
  87.  
  88. See sox man page for detailed information on supported file types, data
  89. formats, and effect options."
  90.     exit 0
  91. }
  92.  
  93. # loop over arguments
  94. while [ $# -ne 0 ]; do
  95.     case "$1" in
  96.     avg|band|bandpass|bandreject|chorus|compand|copy|cut|deemph|earwax|echo|echos|fade|filter|flanger|highp|highpass|lowp|lowpass|map|mask|mcompand|noiseprof|noisered|pan|phaser|pick|pitch|polyphase|rate|repeat|resample|reverb|reverse|silence|speed|split|stat|stretch|swap|trim|vibro|vol)
  97.         effects="$@"
  98.         break
  99.         ;;
  100.     -c)
  101.         shift
  102.         fopts="$fopts -c $1"
  103.         ;;
  104.     --channels=*)
  105.         fopts="$fopts -c `echo $1 | sed 's/.*=//'`"
  106.         ;;
  107.     -d)
  108.         shift
  109.         device="$1"
  110.         ;;
  111.     --device=*)
  112.         device=`echo $1 | sed 's/.*=//'`
  113.         ;;
  114.     -f)
  115.         shift
  116.         fopts="$fopts -$1"
  117.         ;;
  118.     --format=*)
  119.         fopts="$fopts -`echo $1 | sed 's/.*=//'`"
  120.         ;;
  121.     -r)
  122.         shift
  123.         fopts="$fopts -r $1"
  124.         ;;
  125.     --rate=*)
  126.         fopts="$fopts -r `echo $1 | sed 's/.*=//'`"
  127.         ;;
  128.     -s)
  129.         shift
  130.         fopts="$fopts -$1"
  131.         ;;
  132.     --size=*)
  133.         fopts="$fopts -`echo $1 | sed 's/.*=//'`"
  134.         ;;
  135.     -t)
  136.         shift
  137.         fopts2="$fopts -t $1"
  138.         ;;
  139.     --type=*)
  140.         fopts2="$fopts -t `echo $1 | sed 's/.*=//'`"
  141.         ;;
  142.     -v)
  143.         shift
  144.         fopts2="$fopts2 -v $1"
  145.         ;;
  146.     --volume=*)
  147.         fopts2="$fopts2 -v `echo $1 | sed 's/.*=//'`"
  148.         ;;
  149.         -V|--verbose)
  150.             gopts="$gopts -V"
  151.             ;;
  152.     -x|--xinu)
  153.         fopts="$fopts -x"
  154.         ;;
  155.     --file=*)
  156.             if [ $rec_mode = "yes" ]; then
  157.             if [ -z "$filename" ]; then
  158.                     filename=`echo $1 | sed 's/.*=//'`
  159.                 else
  160.                     echo "Filename already given.  Ignoring extra name: $1" 1>&2
  161.             fi
  162.             else
  163.                 filename=`echo $1 | sed 's/.*=//'`
  164.                 play_opts="$play_opts $fopts $fopts2 \"$filename\""
  165.                 fopts=""
  166.                 fopts2=""
  167.             fi
  168.         ;;
  169.     -h)
  170.         help
  171.         ;;
  172.     --help)
  173.         help
  174.         ;;
  175.     --version)
  176.         version
  177.         ;;
  178.     -)
  179.             if [ $rec_mode = "yes" ]; then
  180.             if [ -z "$filename" ]; then
  181.                 filename="-"
  182.                 else
  183.                     echo "Filename already given.  Ignoring extra name: $1" 1>&2
  184.             fi
  185.             else
  186.                 filename="-"
  187.                 play_opts="$play_opts $fopts $fopts2 \"$filename\""
  188.                 fopts=""
  189.                 fopts2=""
  190.             fi
  191.         ;;
  192.     *)
  193.             if [ $rec_mode = "yes" ]; then
  194.             if [ -z "$filename" ]; then
  195.                 filename="$1"
  196.                 else
  197.                     echo "Filename already given.  Ignoring extra name: $1" 1>&2
  198.             fi
  199.             else
  200.                 filename=`echo $1 | sed 's/\ /\\\ /g'`
  201.                 filename=$1
  202.                 play_opts="$play_opts $fopts $fopts2 \"$filename\""
  203.                 fopts=""
  204.                 fopts2=""
  205.             fi
  206.         ;;
  207.     esac
  208.     shift
  209. done
  210.  
  211. # If user sets AUDIODEV environment variable then force output device
  212. # to by that.  Solaris SunRay's make use of this for sure.
  213. if [ -n "$AUDIODEV" ]; then
  214.     device="$AUDIODEV"
  215. fi
  216.  
  217. if [ "$HAVE_ALSA" = "1" ]; then
  218.     arch_defines="-t alsa"
  219.     if [ -z "$device" ]; then
  220.     device="default"
  221.     fi
  222. else
  223.     if [ "$HAVE_OSS" = "1" ]; then
  224.         arch_defines="-t ossdsp"
  225.         if [ -z "$device" ]; then
  226.             device="/dev/dsp"
  227.         fi
  228.     else
  229.         arch=`uname -s`
  230.         case $arch in
  231.             SunOS)
  232.             case `uname -r` in
  233.                 # Solaris software can auto-detect hardware capabilities.
  234.                 5.*)
  235.                 arch_defines="-t sunau"
  236.                 ;;
  237.                 # For SunOS default to signed words.  Some hardware can only play u-law and would need
  238.                 # to be changed here.
  239.                 *)
  240.                 arch_defines="-t sunau -w -s"
  241.                 ;;
  242.             esac
  243.             if [ -z "$device" ]; then
  244.                 device="/dev/audio"
  245.             fi
  246.             ;;
  247.             NetBSD|OpenBSD)
  248.             arch_defines="-t sunau"
  249.             if [ -z "$device" ]; then
  250.                 device="/dev/audio"
  251.             fi
  252.             ;;
  253.         esac
  254.     fi
  255. fi
  256.  
  257. # If name is "rec" then record else assume user is wanting to play
  258. # a sound file.
  259. if [ "$rec_mode" = "yes" ]; then
  260.  
  261.     # Don't send data to stdout if they are reading from it.
  262.     if [ "$filename" = "-" ]; then
  263.       echo "Send break (control-c) to end recording" 1>&2
  264.     else
  265.       echo "Send break (control-c) to end recording"
  266.     fi
  267.     # $fopts are specified on both sides because audio driver
  268.     # may not support the given format and might pick
  269.     # something close to it.  Asume user really wants the
  270.     # file to be in the specified format and so request
  271.     # sox to do any conversions.
  272.     sox $gopts $arch_defines $fopts $device $fopts $fopts2 "$filename" $effects 
  273. else
  274.     # Eval is needed to recongnize the quotes around filename
  275.     # and let them be passed to program as 1 option (in case
  276.     # filename has spaces).
  277.     eval sox $gopts $play_opts $arch_defines $device $effects
  278. fi
  279.